package com.hzx.shoot;

import com.sun.xml.internal.ws.api.message.MessageWritable;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.FlatteningPathIterator;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


/*
 * 测试类
 * */
//jpanel属于的是java的包 容器
public class World extends JPanel {
    //设置画框的大小
    public static final int WIDTH = 512;
    public static final int HEIGHT = 768;
    public Hero hero = new Hero();//变为全局变量
    public Sky sky = new Sky();



    public Bullet[] bullet = {};

    /*    public Bee bee;
        public BigAirplane bigAirplane;
        public Airplane airplane;*/
    //声明了一个数组为敌人数组 用于存放bee/bigairplane/airplane
    public FlyingObject[] enemies = {};

    //生成敌人对象的方法 放回生成敌人的对象
    public FlyingObject nextEnemy() {
        Random random = new Random();
        int index = random.nextInt(20);
        if (index <= 5) {
            return new Bee();
        } else if (index <= 13) {
            return new Airplane();
        } else {
            return new BigAirplane();
        }
    }

    //执行的方法
    public void action() {

        // enemies = new FlyingObject[5];
        //java中的定时器
        Timer timer = new Timer();
        //调用定时器的执行方法【时间表 相当于闹钟 到点生成新的敌人】
        timer.schedule(new TimerTask() {
            @Override
            public void run() {//指定执行任务 第一个10ms
                //敌人入场的
                enterAction();
                //飞行物移动
                stepAction();
                //子弹入场
                shootAction();

            }
        }, 10, 10);


    }

    //声明一个计数的对象 用来控制敌人入场的速度
    int enterIndex = 0;

    //敌人入场的方法
    private void enterAction() {
        enterIndex++;
        if (enterIndex % 40 == 0) {//每400毫秒执行一次 生成一次敌人
            //生成敌人
            FlyingObject f = nextEnemy();
            //将当前敌人数组扩容一个位置
            enemies = Arrays.copyOf(enemies, enemies.length + 1);
            //把生成的敌人放入扩容的位置
            enemies[enemies.length - 1] = f;
        }
    }

    //声明变量控制子弹的频率
    int bulletIndex = 0;

    //子弹入场
    private void shootAction() {
        bulletIndex++;
        if (bulletIndex % 30 == 0) {
            //300毫秒跑一次
            //拿到英雄射击的子弹 将当前子弹数组进行扩容
            Bullet[] b = hero.nextBullet();//返回的是一个数组
            bullet = Arrays.copyOf(bullet, bullet.length + b.length);
            //将英雄射击的数组放入扩容好的数组
            System.arraycopy(b, 0, bullet, bullet.length - b.length, b.length);
        }
    }

    public void stepAction() {
        //让天空移动
        sky.step();
        //敌人移动
        for (int i = 0; i < enemies.length; i++) {
            enemies[i].step();

        }
        //子弹为一个数组
        for (int i = 0; i < bullet.length; i++) {
            bullet[i].step();
        }

    }

    //宽高表示大小
    public int wdith;
    public int height;
    //位置
    public int x;
    public int y;

    //这是继承的画画方法 对其进行重写 g表示画笔
    @Override
    public void paint(Graphics g) {
        // g.drawImage(sky.getImage(), sky.x, sky.y, null);已经在sky方法重写
        sky.paint(g);

/*
        g.drawImage(bee.getImage(),bee.x,bee.y,null);
        g.drawImage(airplane.getImage(),airplane.x,airplane.y,null);
        g.drawImage(bigAirplane.getImage(),bigAirplane.x,bigAirplane.y,null);
*/
        for (int i = 0; i < enemies.length; i++) {
            enemies[i].paint(g);
        }
        // g.drawImage(bullet.getImage(), bullet.x, bullet.y, null);
        // g.drawImage(hero.getImage(), hero.x, hero.y, null);
        hero.paint(g);//因为只需要一张图片所以直接调用父类 不需要重写
        //画子弹
        for (int i = 0; i < bullet.length; i++) {
            bullet[i].paint(g);
        }
        //重复画刷新界面
        repaint();
    }

    public static void main(String[] args) {
        //创建画框  JFrame相当于创建对象
        JFrame jFrame = new JFrame("阿鑫编程");//创建一个画框对象
        //创建一个容器对象 Compent
        World world = new World();
        //把画框放入容器内
        jFrame.add(world);
        //设置画框的显示方式 默认画框大小为0
        jFrame.setVisible(true);
        //设置画框的大小 尺寸
        jFrame.setSize(WIDTH, HEIGHT);
        //设置窗口位置  设置为中间位置
        jFrame.setLocationRelativeTo(null);
        //设置关闭方式
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        world.action();

    }
}
